package config

import (
	"database/sql"
	"fmt"
	"os"
	"strconv"

	"github.com/joho/godotenv"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"

	ossgrpc "image-sever-grpc/oss-server/proto"
)

// 保持原有全局变量定义
var (
	DB             *sql.DB
	WPS            *WPSConfig
	DbConfig       *DBConfig
	OSSClient      ossgrpc.OSSServiceClient
	ServerPort     string
	MaxUploadSize  int64
	AllowFileTypes []string
)

// 数据库配置
type DBConfig struct {
	User     string
	Password string
	Host     string
	Port     string
	Name     string
}

// wps配置
type WPSConfig struct {
	AccessID  string
	SecretKey string
	ProxyAddr string
}

// 针对Image Web服务入口
func InitConfig() error {
	if err := loadEnvFile(); err != nil { // 如果没独立common.go，需重复实现或引用
		return fmt.Errorf("加载环境变量失败: %w", err)
	}
	initBaseConfig() // 通用基础配置初始化
	return initImageWebServerConfig()
}

// 初始化基础配置
func initBaseConfig() {
	MaxUploadSize = getEnvInt64("MAX_UPLOAD_SIZE", 10*1024*1024)
	AllowFileTypes = []string{"image/jpeg", "image/png", "image/gif", "image/webp"}
}

// 初始化imageweb配置
func initImageWebServerConfig() error {
	// 初始化WPS配置
	WPS = &WPSConfig{}
	if err := initWPSConfig(); err != nil {
		return err
	}
	// 初始化数据库配置
	DbConfig = &DBConfig{
		User:     getEnv("DB_USER", "root"),
		Password: getEnv("DB_PASSWORD", "748932"),
		Host:     getEnv("DB_HOST", "localhost"),
		Port:     getEnv("DB_PORT", "3306"),
		Name:     getEnv("DB_NAME", "yzh_image_server"),
	}

	// 初始化OSS客户端
	if err := initOSSClientAuto(); err != nil {
		return fmt.Errorf("自动初始化OSS客户端失败: %w", err)
	}

	ServerPort = getEnv("IMAGE_WEB_SERVER_PORT", "8081")
	return nil
}

// 初始化金山wps配置
func initWPSConfig() error {
	WPS.AccessID = getEnv("WPS_ACCESS_ID", "")
	WPS.SecretKey = getEnv("WPS_SECRET_KEY", "")
	WPS.ProxyAddr = getEnv("WPS_PROXY_ADDR", "http://127.0.0.1:8899")

	if WPS.AccessID == "" || WPS.SecretKey == "" {
		return fmt.Errorf("缺少WPS_ACCESS_ID或WPS_SECRET_KEY配置")
	}
	return nil
}

// 初始化并获得ossclient客户端
func initOSSClientAuto() error {
	// 获取配置环境
	ossServerHost := getEnv("OSS_SERVER_HOST", "localhost")
	ossServerPort := getEnv("OSS_SERVER_PORT", "50051")
	ossServerAddr := fmt.Sprintf("%s:%s", ossServerHost, ossServerPort)
	// 连接oss-server,获取连接客户端
	conn, err := grpc.Dial(ossServerAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		return fmt.Errorf("连接oss-server失败: %w", err)
	}
	OSSClient = ossgrpc.NewOSSServiceClient(conn)
	return nil
}

// 辅助函数：加载.env文件
func loadEnvFile() error {
	if err := godotenv.Load(".env"); err != nil {
		fmt.Printf("警告：未找到.env文件，将使用系统环境变量: %v\n", err)
		return nil // 非致命错误，继续执行
	}
	return nil
}

// 环境变量获取工具函数
func getEnv(key, defaultValue string) string {
	if value, exists := os.LookupEnv(key); exists && value != "" {
		return value
	}
	return defaultValue
}

func getEnvInt64(key string, defaultValue int64) int64 {
	valueStr := getEnv(key, "")
	if valueStr == "" {
		return defaultValue
	}
	value, err := strconv.ParseInt(valueStr, 10, 64)
	if err != nil {
		fmt.Printf("警告：环境变量%s格式错误，使用默认值%d: %v\n", key, defaultValue, err)
		return defaultValue
	}
	return value
}
